package com.yang.smsgateway.task;

import cn.hippo4j.core.executor.support.ThreadPoolBuilder;
import com.yang.common.constant.RabbitMQConstants;
import com.yang.common.constant.SmsConstant;
import com.yang.common.model.StandardReport;
import com.yang.common.model.StandardSubmit;
import com.yang.common.util.CMPPDeliverMapUtil;
import com.yang.common.util.CMPPSubmitRepoMapUtil;
import com.yang.smsgateway.util.SpringUtil;
import com.yang.smsgateway.enums.CMPP2ResultEnums;
import com.yang.smsgateway.netty4.entity.CmppSubmitResp;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;


//不需要注入到IOC容器中，这是一个任务类，哪里需要执行任务，哪里就创建对象就行了
//如果注入到IOC容器中，就会变成单例模式
//即使用到IOC容器中，也可以通过SpringUtil从IOC容器中获取
public class SubmitRepoRunnable implements Runnable {

    private RabbitTemplate rabbitTemplate = SpringUtil.getBeanByClass(RabbitTemplate.class);

    private CmppSubmitResp submitResp;

    //通过 成员变量 + 有参构造方法 将需要的参数封装成实体类传进来，而这个正好就是对应的实体类
    public SubmitRepoRunnable(CmppSubmitResp submitResp) {
        this.submitResp = submitResp;
    }

    @Override
    public void run() {
        System.out.println("当前线程" + Thread.currentThread().getName());

        StandardReport report = null;

        //1、拿到自增ID，并且从ConcurrentHashMap中获取到存储的submit
        StandardSubmit submit = CMPPSubmitRepoMapUtil.remove(submitResp.getSequenceId());

        //2、根据运营商返回的result，确认短信状态并且封装submit
        int result = submitResp.getResult();
        if (0 != result){
            // 到这，说明运营商的提交应答中回馈的是失败的情况,封装submit的两个字段
            String resultMessage = CMPP2ResultEnums.getMsg(result);
            submit.setErrorMsg(resultMessage);
            submit.setReportState(SmsConstant.REPORT_FAIL);
        }else {
            // 如果没进到if中，说明运营商已经正常的接收了发送短信的任务，这边完成步骤3操作
            //3、将submit封装为Report，并将Report临时存储，以便运营商二次返回状态码时，可以再次获取到信息
            // 这里没有对其他信息做封装，用的还是submit
            report = new StandardReport();
            //短信发送中
            submit.setReportState(SmsConstant.REPORT_ING);
            BeanUtils.copyProperties(submit,report);
            CMPPDeliverMapUtil.put(submitResp.getMsgId(),report);
        }

        //4、将封装好的submit直接扔RabbitMQ中，让搜索模块记录信息,写日志到Elasticsearch的队列
        rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_WRITE_LOG,submit);

    }
}
